package com.example.tool.widget;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import com.example.tool.R;
import com.example.tool.adapter.DbPopAdapter;
import com.example.tool.dao.entity.Person;
import com.example.tool.dao.util.PersonDaoUtil;
import com.example.tool.listener.OnBarItemListener;
import com.example.tool.util.DebugLog;
import com.example.tool.util.ToastUtil;
import com.zyyoona7.popup.EasyPopup;
import com.zyyoona7.popup.XGravity;
import com.zyyoona7.popup.YGravity;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/**
 * Created Date 2019/8/30
 *
 * @author liangkun
 * description：EasyPopup工具类
 */
public class PopUtil {

    private WeakReference<EasyPopup> mWeakApply;
    private static PopUtil instance = null;

    public static PopUtil getInstance() {

        synchronized (PopUtil.class) {
            if (instance == null) {
                instance = new PopUtil();
            }
        }
        return instance;
    }

    //中间弹框
    public void showCenterPop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.pop_hint_info)
                .setFocusable(true)
                .setWidth(context.getResources().getDimensionPixelSize(R.dimen.sw_dp_250))
                .setHeight(context.getResources().getDimensionPixelSize(R.dimen.sw_dp_150))
                .setOutsideTouchable(true)
                .setBackgroundDimEnable(true)
                .setDimValue(0.7f)
                .setDimColor(Color.BLACK)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.CENTER, XGravity.CENTER, 0, 0);//中间显示
//        mWeakApply.get().showAsDropDown(view, 0, 0, Gravity.START);
//        mWeakApply.get().showAtLocation(view, Gravity.CENTER, 0, 0);
        mWeakApply.get().findViewById(R.id.tvDelCancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWeakApply.get().dismiss();
            }
        });
        mWeakApply.get().findViewById(R.id.tvDelConfirm).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWeakApply.get().dismiss();
            }
        });
        TextView tvContent = mWeakApply.get().findViewById(R.id.tvContentHint);
        tvContent.setText(content);
    }

    //底部弹框
    public void showBottomPop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.camera_pop_menu)
                .setAnimationStyle(R.style.BottomPopAnim)
                .setFocusable(true)
//                .setOutsideTouchable(true)
                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_165))
                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_BOTTOM, XGravity.CENTER, 0, 0);//中间显示

    }

    //底部弹框
    public void showTopRightPop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.camera_pop_menu)
                .setAnimationStyle(R.style.Top_PopAnim)
                .setFocusable(true)
//                .setOutsideTouchable(true)
                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_165))
                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_TOP, XGravity.CENTER, 0, 0);//中间显示

    }

    //底部弹框
    public void showtop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.popup_test)
//                .setAnimationStyle(R.style.BottomPopAnim) //底部放大弹出
                .setAnimationStyle(R.style.Bottom_PopAnim) //底部缓慢弹出
                .setFocusable(true)
                .setOutsideTouchable(true)

                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_60))
                .setWidth(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_30))
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_TOP, XGravity.CENTER, 0, 0);//中间显示

    }

    //顶部弹框
    public void showTopLagerPop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.pop_lager)
                .setAnimationStyle(R.style.TopPopAnim) //顶部弹出
                .setAnimationStyle(R.style.LeftTopPopAnim) //顶部左上角弹出
                .setAnimationStyle(R.style.Top_PopAnim) //顶部缓慢弹出
                .setFocusable(true)
                .setOutsideTouchable(true)

                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_400))
                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
//                .setFocusAndOutsideEnable(false)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_TOP, XGravity.CENTER, 0, context.getResources().getDimensionPixelSize(R.dimen.sw_dp_40));//中间显示

    }

    //顶部左边弹框
    public void showLeftLagerPop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.pop_lager)
//                .setAnimationStyle(R.style.TopPopAnim) //顶部弹出
//                .setAnimationStyle(R.style.LeftTopPopAnim) //顶部左上角弹出
                .setAnimationStyle(R.style.LeftTopPopAnim) //顶部缓慢弹出
                .setFocusable(true)
                .setOutsideTouchable(true)

                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_400))
                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
//                .setFocusAndOutsideEnable(false)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_TOP, XGravity.CENTER, 0, context.getResources().getDimensionPixelSize(R.dimen.sw_dp_40));//中间显示

    }

    //相对位置
    public void showRelativePop(Context context, View view, String content) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.popup_test)
                .setAnimationStyle(R.style.LeftBottomPopAnim)
                .setFocusable(true)
                .setOutsideTouchable(true) //可以触摸

//                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_400))
//                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.BELOW, XGravity.ALIGN_LEFT, 0, 0);//中间显示

    }

    //相对位置
    public void showLeftPop(Context context, View view, final OnBarItemListener onBarItemListener) {
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.pop_bar_item)
//                .setAnimationStyle(R.style.LeftBottomPopAnim)
                .setFocusable(true)
                .setOutsideTouchable(true) //可以触摸

//                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_400))
//                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());

        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.BELOW, XGravity.LEFT, 0, context.getResources().getDimensionPixelSize(R.dimen.sw_dp_15));//中间显示
        mWeakApply.get().findViewById(R.id.tv_scalein).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBarItemListener != null) {

                    onBarItemListener.OnItemClick(0);
                    mWeakApply.get().dismiss();
                }
            }
        });
        mWeakApply.get().findViewById(R.id.tv_alphain).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBarItemListener != null) {
                    onBarItemListener.OnItemClick(1);
                    mWeakApply.get().dismiss();
                }
            }
        });
        mWeakApply.get().findViewById(R.id.tv_bottom).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBarItemListener != null) {
                    onBarItemListener.OnItemClick(2);
                    mWeakApply.get().dismiss();
                }
            }
        });
        mWeakApply.get().findViewById(R.id.tv_left).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBarItemListener != null) {
                    onBarItemListener.OnItemClick(3);
                    mWeakApply.get().dismiss();
                }
            }
        });
        mWeakApply.get().findViewById(R.id.tv_right).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBarItemListener != null) {
                    onBarItemListener.OnItemClick(4);
                    mWeakApply.get().dismiss();
                }
            }
        });
    }

    /**
     * @param context 上下文
     * @param view    父控件
     * @param content 内容
     * @return
     * @description 数据库底部弹出框
     * @author liangkun
     * @time 2019/9/29 9:32
     */
    public void showBottomDbPop(Context context, View view, final String content) {
        final int[] page = {1};
        int personCount = PersonDaoUtil.getPersonUtil().getPersonCount();
        int allPage = personCount / 30;
        List<Person> datas = new ArrayList<>();
        List<Person> allPerson = new ArrayList<>();
        createWeakReference(EasyPopup.create()
                .setContentView(context, R.layout.pop_db_bottom)
//                .setAnimationStyle(R.style.BottomPopAnim) //底部放大弹出
                .setAnimationStyle(R.style.Bottom_PopAnim) //底部缓慢弹出
                .setFocusable(true)
                .setOutsideTouchable(true)
                //允许背景变暗
                .setBackgroundDimEnable(true)
                //变暗的透明度(0-1)，0为完全透明
                .setDimValue(0.2f)
//                //变暗的背景颜色
//                .setDimColor(Color.WHITE)
                .setHeight(context.getResources().getDimensionPixelOffset(R.dimen.sw_dp_470))
                .setWidth(ViewGroup.LayoutParams.MATCH_PARENT)
                .setFocusAndOutsideEnable(true)//设置触摸外部不消失（false：不消失，true：消失）
                .apply());


        ((TextView) mWeakApply.get().findViewById(R.id.tv_des)).setText(content);
        final LinearLayoutManager manager = new LinearLayoutManager(context);
        final RecyclerView recyclerView = (mWeakApply.get().findViewById(R.id.rv_db));
        View topView = LayoutInflater.from(context).inflate(R.layout.db_item_top, (ViewGroup) recyclerView.getParent(), false);

        if (content.equals("年份区间查询")) {
            allPerson = PersonDaoUtil.getPersonUtil().getRangePerson("1970", "1989");
        } else if (content.equals("25岁区间查询")) {
            allPerson = PersonDaoUtil.getPersonUtil().getInPerson("25");
        } else if (content.equals(">30岁查询")) {
            allPerson = PersonDaoUtil.getPersonUtil().getGtAgePerson("30");
        } else if (content.equals("限制刷新查询")) {
            allPerson = PersonDaoUtil.getPersonUtil().getLimitRefesh(page[0]);
        } else {
            allPerson = PersonDaoUtil.getPersonUtil().getAllPerson();
        }
        datas.addAll(allPerson);
        final DbPopAdapter dbAdapter = new DbPopAdapter(context, allPerson);
        //添加顶部view
        dbAdapter.addHeaderView(topView);
        recyclerView.setLayoutManager(manager);
        recyclerView.setAdapter(dbAdapter);
        /**
         * 相对anchor view显示，适用 宽高不为match_parent
         *
         * @param anchor
         * @param yGravity  垂直方向的对齐方式
         * @param xGravity  水平方向的对齐方式
         * @param x            水平方向的偏移
         * @param y            垂直方向的偏移
         */
        mWeakApply.get().showAtAnchorView(view, YGravity.ALIGN_BOTTOM, XGravity.CENTER, 0, 0);//中间显示
        final EditText editText = mWeakApply.get().findViewById(R.id.et_db);
        TextView tvBtn = mWeakApply.get().findViewById(R.id.tv_ok);
        tvBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = editText.getText().toString();
                if (!TextUtils.isEmpty(str)) {
                    switch (content) {
                        case "增加":
                            //插入数据
                            Person person = PersonDaoUtil.getPersonUtil().insertAddPerson(str);
                            if (person != null) {
                                DebugLog.d(DebugLog.DB_TEST + " 插入成功");
                                editText.setText("");
                                dbAdapter.addData(person);
                            }

                            break;
                        case "删除":

                            break;
                        case "查询":
                            final List<Person> personList = PersonDaoUtil.getPersonUtil().queryPerson(str);
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    dbAdapter.setNewData(personList);
                                }
                            }, 1000);
                            break;
                        case "模糊查询":
                            final List<Person> likePerson = PersonDaoUtil.getPersonUtil().queryLikePerson(str);
                            DebugLog.d(DebugLog.DB_TEST + " 模糊查询 条数 " + likePerson.size());
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    dbAdapter.setNewData(likePerson);
                                }
                            }, 1000);
                            break;
                    }


                } else {
                    ToastUtil.toastShortContent("不能为空");
                }
            }
        });
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (TextUtils.isEmpty(s.toString())) {
                    dbAdapter.setNewData(PersonDaoUtil.getPersonUtil().getAllPerson());
                }
            }
        });
        dbAdapter.setOnLoadMoreListener(() -> {
            if (content.equals("限制刷新查询")){
                if (page[0] <= allPage) {
                    page[0]++;
                    List<Person> limitRefesh = PersonDaoUtil.getPersonUtil().getLimitRefesh(page[0]);
                    datas.addAll(limitRefesh);
                    DebugLog.d(DebugLog.DB_TEST + " 加载更多---- page " + page[0] +" allPage "+allPage+" datas "+datas.size()+" personCount "+personCount);
                    dbAdapter.setNewData(datas);


                } else {
                    ToastUtil.toastShortContent("没有数据了---");
                    dbAdapter.loadMoreEnd();
                }

            }

        }, recyclerView);
    }

    /**
     * 创建弱引用
     *
     * @param apply
     */
    private void createWeakReference(EasyPopup apply) {
        mWeakApply = new WeakReference<>(apply);
    }
}
